Technical Q&A

DV 35 - ネイティブドライバ ('ndrv') と dNeedTime(1999 年 4 月 26 日)


Q: ネイティブドライバを書いていて気づいたのですが、DCtlEntry の dCtlFlags フィールドに dNeedTime を設定すると、どうしても accRun イベントを受信できず、ドライバをアンロードすると、システムがクラッシュしてしまいます。どうすればいいですか。

A: ネイティブドライバモデルの設計者は、ネイティブドライバが DCE (Device Control Entry) にアクセスすることはなく、決してシステムタスク時間を必要としないだろうと感じていました。したがって、彼らは DCE のいくつかのフィールドを他の目的で再使用しました。次に、再使用されたフィールドを示します。

  • dCtlCurTicks
  • dCtlStorage
  • dCtlOwner
  • dCtlWindow

ネイティブドライバに対して、これらのフィールドは現在予約されています。明示的であるか暗黙的であるかに関係なく、開発するソフトウェアがこれらのフィールドの値に依存してはいけません。また、これらのフィールドの値を変更することも禁止されます。dNeedTime を設定すると、システムは dCtlCurTicks の値を変更することになり、これが原因となって、ドライバのアンロードに伴ってシステムが dCtlCurTicks にアクセスするとき、システムはクラッシュしてしまいます。

ネイティブドライバでシステムタスク時間が必要な場合は、ドライバの I/O ファミリによって提供されているサポートを使用してください。たとえば、FireWire ドライバでは FWSendSoftwareInterrupt を使用でき、Open Transport を使用するドライバでは OTScheduleSystemTask を使用できます。ドライバが I/O ファミリを持たない場合、またはその I/O ファミリがシステムタスク時間の取得をサポートしていない場合、残されている唯一の方法は、「Technote 1033 Interrupts in Need of (a Good) Time」で概説されているテクニックの 1 つを使用することです。このテクニカルノートで説明されているアプローチのうち、ネイティブドライバにとって最適なのは、おそらく「アプローチ #3」です。

DTS Q&A DV 27 Device Driver Flags」で説明したように、外部ソフトウェアは、dCtlFlags のビット 3 を検索して、ドライバがネイティブであるかどうかを知らせることができます。

ネイティブドライバがシステムタスク時間を取得できないという問題は、ID 2323538 のバグとして追跡されています。


-- Quinn "The Eskimo!"
Worldwide Developer Technical Support

Technical Q&As | Contents
Previous Question

To contact us, please use the Contact Us page.